# -*- coding: utf-8 -*-

'''
Heranca
'''
import aula5b

class CartaoDeCidadao(aula5b.Cartao, list):
	'''
	Classe derivada de Cartao e de list
	mecanismo de heranca multiplaa
	'''
	def __init__(self, numero, nome, nif='9999'):
		aula5b.Cartao.__init__(self, numero, nome)
		self.nif = nif
		pass
	
	def __str__(self):
		return aula5b.Cartao.__str__(self) + ' '  + str(self.nif) + 'de cidadao' + 'lista: '+ '' + str([str(x) + '' for x in self])
		pass 
	pass 

class CartaoDeCidadaoNovoEstilo(list):
	'''
	Classe derivada de Cartao e de list
	mecanismo de heranca multiplaa
	'''
	
	def __init__(self, numero, nome, nif='9999'):
		__metaclass__ = aula5b.CartaoNovoEstilo
		super(CartaoDeCidadaoNovoEstilo, self).__init__(self, numero, nome)
		self.nif = nif
		pass
	
	def __str__(self):
		return aula5b.CartaoNovoEstilo.__str__(self) + ' ' + str(self.nif) + 'de cidadao' + 'lista: '+ '' + str([str(x) + '' for x in self])
		pass 
	pass 


'''
Iteradores e geradores
'''
class CartaoIterador(aula5b.Cartao):
	
	def __init__(self, numero='', nome=''):
		'''
		Construtor
		'''
		aula5b.Cartao.__init__(self, numero, nome)
		aula5b.Cartao(numero, nome)
		self.index_nome = 0
		pass 
	
	def __iter__(self):
		return self
		
	def next(self):
		if self.index_nome >= len(self.nome):
			raise StopIteration
		x = self.nome[self.index_nome]
		self.index_nome += 1
		return reduce(lambda a, b: a+ b, 
					['' for k in range(self.index_nome)]) + '' + x
		pass 
		
	pass

def lista_salta_em_2(lista):
		'''
		com geradores simplifica -se a criacao de iteradpres 
		'''
		index = 0
		while index < len(lista):
			yield lista[index]
			index += 2
		pass 

def main():
	
	obj1 = CartaoDeCidadao('898989','Manuel Antunes','510417876')
	print obj1
	obj1.append('obs: sinal na bochecha direita')
	obj1.append('obs: olhos azuis')
	print obj1
	
	obj2 = CartaoDeCidadao('11212','Manuel Silva','510417876')
	obj2.append('obs: sinal na bochecha esquerda')
	obj2.append('obs: olhos verdes')
	print obj2
	
	obj3 = CartaoIterador('123456789','Manuel Jardin')
	print obj3.nome
	# e agora uso o iterador sobre o nome
	for x in obj3:
		print x
		
		
	lista = range(20)
	for x in lista_salta_em_2(lista):
		print x 
	
	return 0

if __name__ == '__main__':
	main()

